package Modelo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


public class Partida {
        private Planeta planeta;
        private Terreno terreno;
        private int dimensionX;
        private int dimensionY;
        private Object[][] bloques;
        private Posicion puertaEntrada;
        private Posicion puertaSalida;
        private List<Pooglin> pooglins;
        
        /** Constructores **/
        public Partida(Planeta planeta,Terreno terreno){
                this.dimensionX = terreno.getDimensionX();
                this.dimensionY = terreno.getDimensionY();
                this.bloques = (Object[][]) terreno.getBloques();
                this.puertaEntrada = terreno.getPuertaEntrada();
                this.puertaSalida = terreno.getPuertaSalida();
                this.pooglins = planeta.getPooglins();
        }
        
        public Partida (Element xmlElement){
                Planeta planetaAux = new Planeta ("archivo.txt");
                Terreno terrenoAux = new Terreno ("archivo.txt",planetaAux);
                this.dimensionX=Integer.parseInt(xmlElement.getAttribute("dimensionX"));
                this.dimensionY=Integer.parseInt(xmlElement.getAttribute("dimensionY"));
                this.bloques=new Bloque[this.dimensionX][this.dimensionY];
                int cantItem= (xmlElement.getElementsByTagName("Bloque").getLength());
         	   	String tunel=new String ("Tunel");
                for (int nroItem=0;nroItem < cantItem;nroItem++){
                        String tipoBloque=((Element)xmlElement.getElementsByTagName("Bloque").item(nroItem)).getAttribute("Tipo");
                 	   if (tipoBloque.equals(tunel)){ 
                 		   int posicionX=Integer.parseInt(((Element)xmlElement.getElementsByTagName("Posicion").item(nroItem+2)).getAttribute("posicionX"));
                 		   int posicionY=Integer.parseInt(((Element)xmlElement.getElementsByTagName("Posicion").item(nroItem+2)).getAttribute("posicionY"));
                 		   this.bloques[posicionX][posicionY]=terrenoAux.nuevoBloqueTunel(new Posicion(posicionX,posicionY),
                 				   new Boolean(((Element)xmlElement.getElementsByTagName("Bloque").item(nroItem)).getAttribute("haciaDerecha")));
                        }else{
	                        int posicionX=Integer.parseInt(((Element)xmlElement.getElementsByTagName("Posicion").item(nroItem+2)).getAttribute("posicionX"));
	                        int posicionY=Integer.parseInt(((Element)xmlElement.getElementsByTagName("Posicion").item(nroItem+2)).getAttribute("posicionY"));
	                        Constantes.TIPOS_DE_BLOQUE tipo= Constantes.stringToEnum(tipoBloque);
	                        this.bloques[posicionX][posicionY]=terrenoAux.nuevoBloque(tipo, new Posicion(posicionX,posicionY));
                        }
                }
                this.puertaEntrada=new Posicion((Element)xmlElement.getElementsByTagName("Posicion").item(0));
                this.puertaSalida=new Posicion((Element)xmlElement.getElementsByTagName("Posicion").item(1));
                int cantPooglins=(xmlElement.getElementsByTagName("Pooglin").getLength());
                this.pooglins= new LinkedList<Pooglin>();
                for (int nroPooglins=0; nroPooglins < cantPooglins; nroPooglins++){
                        this.pooglins.add(new Pooglin ((Element)xmlElement.getElementsByTagName("Pooglin").item(nroPooglins)));
                }
                this.planeta = new Planeta (this.pooglins);
                this.terreno = new Terreno (this.dimensionX,this.dimensionY,this.bloques,
                                                                        this.puertaEntrada,this.puertaSalida);
                this.planeta.setTerreno(this.terreno);
                this.terreno.setPlaneta(this.planeta);
                Iterator<Pooglin> it = this.planeta.getPooglins().iterator();
                while (it.hasNext()){
                        it.next().setTerrenoActual(this.terreno);
                }
                
        }
        
        /** Metodos de obtencion de Planeta y Terreno recuperados **/
        
        public Terreno getTerreno(){
                return this.terreno;
        }
        
        public Planeta getPlaneta(){
                return this.planeta;
        }
        
        /** Metodos de consulta **/
        public int getDimensionX() {
                return dimensionX;
        }
        public int getDimensionY() {
                return dimensionY;
        }
        public Object[][] getBloques() {
                return bloques;
        }
        public Posicion getPuertaEntrada() {
                return puertaEntrada;
        }
        public Posicion getPuertaSalida() {
                return puertaSalida;
        }
        public List<Pooglin> getPooglins() {
                return pooglins;
        }
        
        /** Metodo para guardar en archivo de xml **/
        public Element toXml (Document doc){
                Element xmlElement = doc.createElement("Partida");
                xmlElement.setAttribute("dimensionX", ""+this.dimensionX);
                xmlElement.setAttribute("dimensionY", ""+this.dimensionY);
                xmlElement.appendChild(this.puertaEntrada.toXml(doc));
                xmlElement.appendChild(this.puertaSalida.toXml(doc));
                for (int j=0;j<this.dimensionY;j++){
                        for (int i=0;i<this.dimensionX;i++){
                                if (this.bloques[i][j]!=null)
                                        xmlElement.appendChild(((Bloque)this.bloques[i][j]).toXml(doc));
                        }
                }
                for (Pooglin pooglin : pooglins) {
                        xmlElement.appendChild(pooglin.toXml(doc));
                }
                
                return xmlElement;
        }
        
        
}
